﻿#pragma once

#include "Framework/CommonHead.h"
#include "Widgets/Widget.h"
#include "HorizontalPositionerWidget.m.h"

RENUM()
enum class EHorizontalPositionerHideMethod
{
    NevenHide, //在空间不够时，不隐藏任何子控件
    HideLeft, //如果空间不够，优先隐藏左边的子控件
    HideRight, //如果空间不够，优先隐藏右边的子控件
};

RENUM()
enum class EHorizontalPositionerAlign
{
    Left,
    Right,
    Center,
};

//可以水平排列子控件的控件
//需要子控件：
//1.不设置X属性以及水平方向的锚点。X属性会在排列时被修改，水平方向的锚点会导致排列错误
//2.设置宽度属性，并且宽度属性与X属性无关。如果宽度属性是X的函数，那么在排列时会出现错误
//子控件总是从左到右排列，第一个子控件在最左边，最后一个子控件在最右边
RCLASS()
class WHENGINE_API  RHorizontalPositionerWidget :public RWidget
{
    ROBJECT
public:          

    //子控件间距
    RFIELD()
    TWidgetAttribute<float> Spacing=10;

    //在空间不够时，隐藏子控件的方法，与裁剪无关
    //隐藏功能不会修改子控件的任何属性
    //默认不隐藏任何子控件
    RFIELD()
    TWidgetAttribute<EHorizontalPositionerHideMethod> HideMethod
        =EHorizontalPositionerHideMethod::NevenHide;

    //子控件对齐方式,默认左对齐
    RFIELD()
    TWidgetAttribute<EHorizontalPositionerAlign> Align
        =EHorizontalPositionerAlign::Left;

    virtual void CalculateChildrenPresentPositionAndSize() override;

    float GetContentPresentLength()
    {
        return PresentLength;
    }

    virtual float CalculateContentWidth() override;



    void ArrangeChildren();

    //在子控件排列完成后调用
    TDelegate<void> OnChildrenArranged;

protected:

    //选择渲染哪个控件
    virtual void PaintSubWidgets(uint16_t&  InZOrder) override;

    //不被隐藏的子控件范围[MinVisibleSubWidgetIndex,MaxVisibleSubWidgetIndex]
    //如果所有子控件都不可见，那么索引可能不在有效范围内,HasVisibleSubWidget为false
    int32_t MinVisibleSubWidgetIndex=0;
    int32_t MaxVisibleSubWidgetIndex=0;
    bool HasVisibleSubWidget=false;

    //子控件实际总长度，包含间距
    float PresentLength=0;    
};